Spring Security-তে UserDetailsService ইন্টারফেসটি একটি কেন্দ্রীয় ভূমিকা পালন করে। এটি এমন একটি কনট্রাক্ট প্রদান করে যার মাধ্যমে Spring Security আপনার অ্যাপ্লিকেশনের ব্যবহারকারী ডেটা লোড করতে পারে। এটি সাধারণত ডেটাবেস থেকে ব্যবহারকারী তথ্য রিট্রিভ করতে ব্যবহৃত হয়।
UserDetailsService ইন্টারফেস
UserDetailsService Spring Security-এর একটি প্রধান ইন্টারফেস যা শুধুমাত্র একটি মেথড প্রদান করে:
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
- Parameter:
username: ব্যবহারকারীর নাম যা লগইন করার সময় সরবরাহ করা হয়।
- Return Type:
- এটি একটি
UserDetailsঅবজেক্ট রিটার্ন করে যা ব্যবহারকারীর তথ্য ধারণ করে।
- এটি একটি
- Exception:
- যদি ব্যবহারকারী পাওয়া না যায়, তাহলে এটি
UsernameNotFoundExceptionছুড়ে দেয়।
- যদি ব্যবহারকারী পাওয়া না যায়, তাহলে এটি
Custom UserDetails তৈরি
Spring Security ডিফল্টভাবে org.springframework.security.core.userdetails.User ক্লাসটি ব্যবহার করে। তবে, যদি আপনার অ্যাপ্লিকেশনের জন্য অতিরিক্ত ব্যবহারকারী তথ্য (যেমন phoneNumber, address) প্রয়োজন হয়, তাহলে আপনাকে একটি custom UserDetails ক্লাস তৈরি করতে হবে।
১. Custom UserDetails ক্লাস তৈরি করুন
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.Collection;
public class CustomUserDetails implements UserDetails {
private String username;
private String password;
private boolean isEnabled;
private Collection<? extends GrantedAuthority> authorities;
private String phoneNumber; // Custom attribute
public CustomUserDetails(String username, String password, boolean isEnabled,
Collection<? extends GrantedAuthority> authorities,
String phoneNumber) {
this.username = username;
this.password = password;
this.isEnabled = isEnabled;
this.authorities = authorities;
this.phoneNumber = phoneNumber;
}
// Standard UserDetails methods
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return authorities;
}
@Override
public String getPassword() {
return password;
}
@Override
public String getUsername() {
return username;
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return isEnabled;
}
// Custom getter
public String getPhoneNumber() {
return phoneNumber;
}
}
২. Custom UserDetailsService ইমপ্লিমেন্ট করুন
UserDetailsService ইন্টারফেসটি ইমপ্লিমেন্ট করুন এবং আপনার ডেটাবেস থেকে ব্যবহারকারী ডেটা লোড করার জন্য এটি কাস্টমাইজ করুন।
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import java.util.Collections;
@Service
public class CustomUserDetailsService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// Replace this with your database query
if (!"testuser".equals(username)) {
throw new UsernameNotFoundException("User not found with username: " + username);
}
// Simulated user data
String password = "$2a$10$abc123..."; // BCrypt hashed password
boolean isEnabled = true;
String phoneNumber = "123-456-7890";
// Return custom UserDetails
return new CustomUserDetails(username, password, isEnabled, Collections.emptyList(), phoneNumber);
}
}
৩. Custom UserDetailsService Spring Security Configuration-এ যুক্ত করুন
Spring Security configuration ক্লাসে CustomUserDetailsService ইমপ্লিমেন্টেশন ইনজেক্ট করুন।
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
public class SecurityConfig {
private final CustomUserDetailsService userDetailsService;
public SecurityConfig(CustomUserDetailsService userDetailsService) {
this.userDetailsService = userDetailsService;
}
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin();
return http.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public AuthenticationManager authenticationManager(HttpSecurity http) throws Exception {
return http.getSharedObject(AuthenticationManagerBuilder.class)
.userDetailsService(userDetailsService)
.passwordEncoder(passwordEncoder())
.and()
.build();
}
}
৪. Custom UserDetails Access করা
Spring Security-এর মাধ্যমে লগইন করার পরে, ব্যবহারকারীর ডেটা অ্যাক্সেস করতে Authentication অবজেক্ট ব্যবহার করুন।
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
public class UserService {
public void getCurrentUserDetails() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
CustomUserDetails userDetails = (CustomUserDetails) authentication.getPrincipal();
System.out.println("Username: " + userDetails.getUsername());
System.out.println("Phone Number: " + userDetails.getPhoneNumber());
}
}
উপসংহার
Spring Security-এর UserDetailsService ইন্টারফেস এবং Custom UserDetails ক্লাস ব্যবহার করে একটি highly customizable authentication ব্যবস্থা তৈরি করা যায়। ডেটাবেস থেকে ব্যবহারকারী তথ্য সংগ্রহ এবং লগইন প্রক্রিয়ার সময় ব্যবহারকারী যাচাই করার জন্য এই পদ্ধতি কার্যকর। Spring Security-এর সুবিধা ব্যবহার করে নিরাপত্তা ব্যবস্থা আরও শক্তিশালী করতে এই ধরণের কাস্টমাইজেশন অপরিহার্য।
Read more